package net.thxjj.netty;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import io.netty.channel.Channel;
import io.netty.util.AttributeKey;


public class DeviceSocketMap {
	private static Logger log = Logger.getLogger(String.valueOf(DeviceSocketMap.class));
	//保存连接的Socket连接
	public static  Map<String,Channel > connections = new HashMap<String,Channel>();
	
	
	//获取所有的设备devTid
	public static Set<String> getOnlineDevice(){
		return connections.keySet();
	}


	/**
	 * 判断一个通道是否有设备在使用
	 * 可做信息转发时判断该通道是否合法
	 * @param channel
	 * @return
	 */
	public static boolean hasDevice(Channel channel) {
		AttributeKey<String> key = AttributeKey.valueOf("device");
		return (channel.hasAttr(key) && channel.attr(key).get() != null);//netty移除了这个map的remove方法,这里的判断谨慎一点
	}


	/**
	 * 上线一个设备
	 *
	 * @param channel
	 * @param devTid
	 */
	public static void addDevice(Channel channel, String devTid,String prodKey) {
		//先判断用户是否在web系统中登录?
		//这部分代码个人实现,参考上面redis中的验证

		connections.put(devTid, channel);
		AttributeKey<String> key = AttributeKey.valueOf("device");
		AttributeKey<String> key2 = AttributeKey.valueOf("prodKey");
		channel.attr(key).set(devTid);
		channel.attr(key2).set(prodKey);

	}



	/**
	 * 根据devTid获取该设备的通道
	 *
	 * @param devTid
	 * @return
	 */
	public static Channel getChannelByDevTid(String devTid) {
		return connections.get(devTid);
	}

	/**
	 * 判断一个设备是否在线
	 *
	 * @param devTid
	 * @return
	 */
	public static Boolean online(String devTid) {
		return connections.containsKey(devTid) && connections.get(devTid) != null;
	}
	
	public static void removeSocketDevice(Channel st){
		//移除连接
		AttributeKey<String> key = AttributeKey.valueOf("device");
		String devTid = st.attr(key).get();
		connections.remove(devTid);
	}
	
	
	
}
